ポートをLISTENしているコンテナのdocker-composeプロジェクトを特定する
はじめに
docker-composeでミドルウェアやモックのAPIをローカルで起動する開発を複数プロジェクトで行っていると「コンテナを起動しようとしたけど既に別のプロセスがLISTENしていて起動できない」なんてことがよくあります。たいていの場合数日前に起動した別プロジェクトのコンテナが原因なのですがさっぱり思い出せません。という時にどのプロジェクトのコンテナなのかを調査する方法をいくつか見つけたのでメモしておきます。
Dashboardを使う
コンテナが少ない場合はDockerDesktopに含まれるDashboardが便利です。
Dashboardにはdocker-composeのプロジェクト単位でコンテナ(群)の起動状態を確認できるので、ここで起動しているコンテナにあたりをつけ、さらに詳細を確認することでどのプロジェクトのコンテナが目的のポートを使っているか確認できます。
docker psとinspectを使う
コンテナが多い場合や、GUIで詳細を確認していく場合はdocker psとdocker inspectによってプロジェクトを特定することができます。
ここでは例として以下のコンテナが動いているとします。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 30ba66683977 mysql:5.7.19 "docker-entrypoint.s…" 24 hours ago Up 24 hours 0.0.0.0:3306->3306/tcp iggy-v2_mysql_1 c86a50ccbd7b localstack/localstack "docker-entrypoint.sh" 4 months ago Up 14 seconds 4567-4568/tcp, 4570-4584/tcp, 8080/tcp, 0.0.0.0:4569->4569/tcp facilitator-rotate-bot_localstack_1
ポート4569で動いているコンテナのプロジェクトを特定するため、まずはdocker psで目的のポートを使っているコンテナを特定します。
$ docker ps | grep 4569 c86a50ccbd7b localstack/localstack "docker-entrypoint.sh" 4 months ago Up 3 minutes 4567-4568/tcp, 4570-4584/tcp, 8080/tcp, 0.0.0.0:4569->4569/tcp facilitator-rotate-bot_localstack_1
次にコンテナID c86a50ccbd7b
を指定してコンテナのタグを表示します。
docker inspect c86a50ccbd7b | jq .[0].Config.Labels { "authors": "Waldemar Hummer ([email protected]), Gianluca Bortoli ([email protected])", "com.docker.compose.config-hash": "6bc6d7bab70ac8506563e0cf12124cd2541cc1d953de979aae53dd89f60fd74b", "com.docker.compose.container-number": "1", "com.docker.compose.oneoff": "False", "com.docker.compose.project": "facilitator-rotate-bot", "com.docker.compose.project.config_files": "docker-compose.yml", "com.docker.compose.project.working_dir": "/Users/sasaki.kazuhiro/src/github.com/cm-kazup0n/facilitator-rotate-bot", "com.docker.compose.service": "localstack", "com.docker.compose.version": "1.25.4" }
出力されるタグの中のcom.docker.compose
で始まるタグを見るとコンテナのプロジェクト名、ディレクトリがわかります。あとは当該プロジェクトのディレクトリに移動してdocker-compose stopするなり、Dashboardで停止するなりしてコンテナを停止します。
まとめ
docker-composeのポート番号は環境変数とdirenvで管理しましょう・・・。